<?php

namespace fast;

use stdClass;

/**
 * 腾讯云 短信发送
 */
class Cloud{
    
    private $url;
    private $appid;
    private $appkey;
    
    /**
     * 构造函数
     * @param string $appid
     * @param string $appkey
     */
    public function __construct($appid, $appkey){
        $this->url = "https://yun.tim.qq.com/v5/tlssmssvr/sendsms";
        $this->appid = $appid;
        $this->appkey = $appkey;
    }
    
    public function send($phoneNumber, $params, $random, $nationCode = '86', $templId = 261313, $sign = "", $extend = "", $ext = ""){
        $time = time();
        $wholeUrl = $this->url."?sdkappid=".$this->appid."&random=".$random;
        
        $tel = new stdClass();
        $tel->mobile = ''.$phoneNumber;
        $tel->nationcode = ''.$nationCode;
        
        // 按照协议组织 post 包体
        $data = new stdClass();
        $data->tel = $tel;
        $data->sig = $this->calculateSigForTempl($this->appkey, $random, $time, $phoneNumber);
        $data->tpl_id = $templId;
        $data->params = $params;
        $data->sign = $sign;
        $data->time = $time;
        $data->extend = $extend;
        $data->ext = $ext;
        
        return $this->sendCurlPost($wholeUrl, $data);
    }
    
    
    /**
     * 生成签名
     *
     * @param string $appkey        sdkappid对应的appkey
     * @param string $random        随机正整数
     * @param string $curTime       当前时间
     * @param array  $phoneNumbers  手机号码
     * @return string  签名结果
     */
    public function calculateSigForTemplAndPhoneNumbers($appkey, $random, $curTime, $phoneNumbers)
    {
        $phoneNumbersString = $phoneNumbers[0];
        for ($i = 1; $i < count($phoneNumbers); $i++) {
            $phoneNumbersString .= (",".$phoneNumbers[$i]);
        }
        
        return hash("sha256", "appkey=".$appkey."&random=".$random."&time=".$curTime."&mobile=".$phoneNumbersString);
    }
    
    /**
     * 生成签名
     *
     * @param string $appkey        sdkappid对应的appkey
     * @param string $random        随机正整数
     * @param string $curTime       当前时间
     * @param array  $phoneNumber   手机号码
     * @return string  签名结果
     */
    private function calculateSigForTempl($appkey, $random, $curTime, $phoneNumber)
    {
        $phoneNumbers = array($phoneNumber);
        
        return $this->calculateSigForTemplAndPhoneNumbers($appkey, $random, $curTime, $phoneNumbers);
    }
    
    /**
     * 发送请求
     *
     * @param string $url      请求地址
     * @param array  $dataObj  请求内容
     * @return string 应答json字符串
     */
    public function sendCurlPost($url, $dataObj)
    {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_HEADER, 0);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl, CURLOPT_POST, 1);
        curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 60);
        curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($dataObj));
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
        
        $ret = curl_exec($curl);
        if (false == $ret) {
            // curl_exec failed
            $result = "{ \"result\":".-2 .",\"errmsg\":\"".curl_error($curl)."\"}";
        } else {
            $rsp = curl_getinfo($curl, CURLINFO_HTTP_CODE);
            if (200 != $rsp) {
                $result = "{ \"result\":".-1 .",\"errmsg\":\"". $rsp
               ." ".curl_error($curl) ."\"}";
            } else {
                $result = $ret;
            }
        }
        
        curl_close($curl);
        
        return $result;
    }
}